from mcp.server.fastmcp import FastMCP, Context
import subprocess
import json
from typing import List, Optional

mcp = FastMCP("Pluma MCP Server")
"""
Pluma 文本编辑器 MCP Server

面向软件：pluma（GNOME 桌面环境的文本编辑器）

MCP tools 列表：
1. pluma_open_file - 打开指定文件
   - 参数：file_path (str) - 要打开的文件路径
   - 返回：执行结果 JSON

2. pluma_show_version - 显示 pluma 版本信息
   - 参数：无
   - 返回：执行结果 JSON

3. pluma_open_with_encoding - 使用指定编码打开文件
   - 参数：file_path (str) - 要打开的文件路径, encoding (str) - 编码格式
   - 返回：执行结果 JSON

4. pluma_list_encodings - 列出支持的编码格式
   - 参数：无
   - 返回：执行结果 JSON

5. pluma_new_window - 在新窗口中打开文件
   - 参数：file_path (str) - 要打开的文件路径
   - 返回：执行结果 JSON

6. pluma_new_document - 创建新文档
   - 参数：无
   - 返回：执行结果 JSON

7. pluma_open_with_display - 在指定显示设备上打开文件
   - 参数：file_path (str) - 要打开的文件路径, display (str) - 显示设备
   - 返回：执行结果 JSON

所有工具返回统一 JSON 结构：
{
  "success": bool,
  "command": str,
  "exit_code": int,
  "stdout": str,
  "stderr": str
}
"""


@mcp.tool()
def pluma_open_file(file_path: str) -> dict:
    """
    使用 pluma 打开指定文件
    
    参数:
        file_path (str): 要打开的文件路径
        
    返回:
        dict: 包含执行结果的 JSON 对象
    """
    command = ["pluma", file_path]
    result = subprocess.run(command, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }


@mcp.tool()
def pluma_show_version() -> dict:
    """
    显示 pluma 版本信息
    
    返回:
        dict: 包含执行结果的 JSON 对象
    """
    command = ["pluma", "--version"]
    result = subprocess.run(command, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }


@mcp.tool()
def pluma_open_with_encoding(file_path: str, encoding: str) -> dict:
    """
    使用指定编码格式打开文件
    
    参数:
        file_path (str): 要打开的文件路径
        encoding (str): 编码格式（如：utf-8, gbk 等）
        
    返回:
        dict: 包含执行结果的 JSON 对象
    """
    command = ["pluma", f"--encoding={encoding}", file_path]
    result = subprocess.run(command, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }


@mcp.tool()
def pluma_list_encodings() -> dict:
    """
    列出 pluma 支持的所有编码格式
    
    返回:
        dict: 包含执行结果的 JSON 对象
    """
    command = ["pluma", "--list-encodings"]
    result = subprocess.run(command, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }


@mcp.tool()
def pluma_new_window(file_path: str) -> dict:
    """
    在新窗口中打开文件
    
    参数:
        file_path (str): 要打开的文件路径
        
    返回:
        dict: 包含执行结果的 JSON 对象
    """
    command = ["pluma", "--new-window", file_path]
    result = subprocess.run(command, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }


@mcp.tool()
def pluma_new_document() -> dict:
    """
    创建新的空白文档
    
    返回:
        dict: 包含执行结果的 JSON 对象
    """
    command = ["pluma", "--new-document"]
    result = subprocess.run(command, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }


@mcp.tool()
def pluma_open_with_display(file_path: str, display: str) -> dict:
    """
    在指定显示设备上打开文件
    
    参数:
        file_path (str): 要打开的文件路径
        display (str): 显示设备（如：:0.0）
        
    返回:
        dict: 包含执行结果的 JSON 对象
    """
    command = ["pluma", f"--display={display}", file_path]
    result = subprocess.run(command, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }


if __name__ == "__main__":
    mcp.run()